package ar.edu.utn.frgp.TPFinalBanco.action;

import ar.edu.utn.frgp.TPFinalBanco.model.Cliente;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionClienteServiceImpl;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;
import com.opensymphony.xwork2.validator.annotations.EmailValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.ValidatorType;

public class GestionClienteAction extends BaseAction {

	private static final long serialVersionUID = 1L;

	private String dni;
	private String nombre;
	private String apellido;
	private String direccion;
	private String mail;
	private String contrasenia;
	private Cliente cliente;

	public String alta() {

		// validamos que el cliente no exista
		GestionClienteServiceImpl clienteService = (GestionClienteServiceImpl) getContext()
				.getBean("gestionClientesService");
		Cliente clienteAvalidar = clienteService.getCliente(dni);

		if (clienteAvalidar == null) {

			// creamos el nuevo cliente
			Cliente cliente = new Cliente(dni, nombre, apellido, direccion,
					mail, null, contrasenia);
			// lo guardamos en la BD
			clienteService.createCliente(cliente);
			
			//lo subimos a la sesión
			ActionContext.getContext().getSession().put("cliente", cliente);
			
			return SUCCESS;
		} else {
			String errorMsg = String.format(
					"El cliente con dni '%s' ya se encuentra registrado.", dni);
			addActionError(errorMsg);
			return ERROR;
		}
	}

	public String modificacion() {

		// obtenemos el cliente de la sesión
		Cliente clienteAmodif = (Cliente) ActionContext.getContext()
				.getSession().get("cliente");

		clienteAmodif.setApellido(apellido);
		clienteAmodif.setContrasenia(contrasenia);
		clienteAmodif.setDireccion(direccion);
		clienteAmodif.setMail(mail);
		clienteAmodif.setNombre(nombre);

		// actualizamos los datos del cliente en la BD
		GestionClienteServiceImpl clienteService = (GestionClienteServiceImpl) getContext()
				.getBean("gestionClientesService");
		clienteService.updateCliente(clienteAmodif);
		
		//actualizamos los datos del usuario en sesión
		ActionContext.getContext().getSession().put("cliente", clienteAmodif);
		setCliente(clienteAmodif);
		return SUCCESS;
	}
	
	public String eliminacion() {

		// obtenemos el cliente de la sesión
		Cliente clienteAelim = (Cliente) ActionContext.getContext()
				.getSession().get("cliente");

		// actualizamos los datos del cliente en la BD
		GestionClienteServiceImpl clienteService = (GestionClienteServiceImpl) getContext()
				.getBean("gestionClientesService");
		clienteService.deleteCliente(clienteAelim);
		
		//actualizamos los datos del usuario en sesión
		ActionContext.getContext().getSession().remove(cliente);
		return SUCCESS;
	}

	public String getDni() {
		return dni;
	}

	@RegexFieldValidator(message = "El dni debe tener sólo números", shortCircuit = true, expression = "[0-9]*")
	@RequiredStringValidator(message = "Campo Obligatorio: Debe ingresar un dni", type = ValidatorType.FIELD, shortCircuit = true, trim = true, fieldName = "dni")
	public void setDni(String dni) {
		this.dni = dni;
	}

	public String getNombre() {
		return nombre;
	}

	@RequiredStringValidator(message = "Campo Obligatorio: Debe ingresar un nombre", type = ValidatorType.FIELD, shortCircuit = true, trim = true, fieldName = "nombre")
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	@RequiredStringValidator(message = "Campo Obligatorio: Debe ingresar un apellido", type = ValidatorType.FIELD, shortCircuit = true, trim = true, fieldName = "apellido")
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getDireccion() {
		return direccion;
	}

	@RequiredStringValidator(message = "Campo Obligatorio: Debe ingresar una dirección", type = ValidatorType.FIELD, shortCircuit = true, trim = true, fieldName = "direccion")
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public String getMail() {
		return mail;
	}

	@EmailValidator(message = "El mail ingresado es inválido", type = ValidatorType.FIELD, shortCircuit = true, fieldName = "mail")
	public void setMail(String mail) {
		this.mail = mail;
	}

	public String getContrasenia() {
		return contrasenia;
	}

	@RequiredStringValidator(message = "Campo Obligatorio: Debe ingresar una contraseña", type = ValidatorType.FIELD, shortCircuit = true, trim = true, fieldName = "contrasenia")
	public void setContrasenia(String contrasenia) {
		this.contrasenia = contrasenia;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
}
